# 我们将通过一个小游戏来完成对PyQt5当中的QPainter的认识 （图形绘制）
# 要知道，在QT5当中一个非常重要的类就是QPainter Class 图形绘制类

# 导包
from PyQt5.QtWidgets import *         # 绘制图形是在widget面绘制的
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtMultimedia import *      # 因为要实现音乐的播放


# 我们是在文本编辑器中绘图的
class PlainTextEdit(QPlainTextEdit):

    # 由于我们想要实现通过鼠标点击来完成点的绘制，所以我们需要一些初始化的而处理
    def __init__(self):
        # 下面就是在调用父类相应基本的绘制的同时，再增添一些自定义的操作
        super().__init__()
        self._holes = []    # 着代表我画多少个点
        self._bullet = QPixmap("bullet.png")   # 这里就是添加点击时炸裂的效果（也就是图片）
        size = self._bullet.size()             # 画图要有大小，那么我们先要得到子弹的大小
        self._offset = QPoint(int(size.width()/2), int(size.height()/2))       # 画图要有起始点(也就是要在哪个点开始绘制)

    # 画图的过程是我们通过点击鼠标来完成的(也就是我们要重新定义一下鼠标按下去收的触发方法)
    def mousePressEvent(self, e) -> None:
        # 具体的：鼠标每点一下就需要画一个洞
        self._holes.append(e.pso())           # 也就是每点一下你就需要获得一次点击的为止
        # 注意，再重写父类方法时，一般还是需要调用父类当中的一些方法
        super().mousePressEvent(e)            # 也就是需要使用到父类当中的底层逻辑来完成自身的特殊化效果
        self.viewport().update()        # 我们要不断更新试图（也就是鼠标点击之后，我们要刷新出我们点击后的效果）
        QSound.play("shot.mp3")         # 添加点击时的音乐效果

    ###############################################
    # 在此之上都是初始化的操作，也就是哦我们画图所需要的一些准备工作以及工作流程
    # 而具体我们怎么来画呢
    def paintEvent(self, e) -> None:
        # 首先还是要调用父类的绘制方法，来补全底层逻辑
        super().paintEvent(e)
        # 接下来，我们就开始按照自己需求来定义画画过程
        # 第一步是，画画首先要有画笔
        painter = QPainter(self.viewport())         # 定义画笔对象
        # 第二步是画洞（射击的效果）
        for hole in self._holes:
            painter.drawPixmap(hole - self._offset, self._bullet)
            # 依次取出holes列表当中点的位置（hole in self._holes），
            # 通过画笔（painter）来画图片（.drawPixmap）
            # 而这个图片需要给出位置（hole - self._offset）这里是对画画点做了一些处理，防止画的点溢出画图范围
            #         还需要指定画图的图形（self._bullet）爆炸效果

# 上面我们定义好了画画的过程
# 接下来我们需要将上面的所有都显示出来


class MainWindow(QMainWindow):
    # 这里其实只需要创建一个继承了QMainWindow的窗口实现的类即可（我们主要是实现绘图界面的显现）
    pass


# 创建一个启动的app对象（用来控制程序的运行以及终止）
app = QApplication([])
app.setApplicationName('图形绘制')      # 为程序设定名字
text = PlainTextEdit()                 # 生成文本编辑器的内容对象（内容就是我们自己定义的绘图）
text.setPlainText('点击鼠标发射子弹')     # 在文本编辑器中加入提示信息
window = MainWindow()                  # 创建一个窗体对象
window.setCentralWidget(text)          # 将文本编辑器添加到窗体对象中去
window.setMinimumSize(800, 600)        # 设置窗体的最小界面大小800*600

# 显示窗体
window.show()
# 让程序持续运行
app.exec_()

# 这里并没有运行成功，但是可以学习一下比较重要的逻辑思路
# 也就是在实现记忆性绘画的时候（也就是之前画的东西要持续显示着）
# 那么就需要一个容器来存放之前的绘画信息，并且还需要不断地刷新显示

